// COMMON.C
void memcpy(u8int* destination, const u8int* source, u32int length);
void memset(u8int* destination, u8int value, u32int length);
void memcpy16(u16int* destination, const u16int* source, u32int length);
void memset16(u16int* destination, u16int value, u32int length);
int max(int a, int b);
int min(int a, int b);
int strlen(const char* str);
int strcmp(const char* str1, const char* str2);
char* strcpy(char* destination, const char* source);
char* strcat(char* destination, const char* source);
char* strrev(char* source);
char* itoa(u32int val, int base);
extern void outb(u16int port, u8int value);
extern u8int inb(u16int port);
extern u16int inw(u16int port);

// GDT.C
void init_gdt();
gdt_entry create_gdt_entry(u32int base, u32int limit, u8int access, u8int granularity);
gdt_entry get_gdt_entry(u32int index);
void set_gdt_entry(u32int index, gdt_entry entry);
void assemble_gdt();
extern void gdt_flush(u32int);

// IDT.C
void init_idt();
void create_idt_entry(u32int index, u32int base, u32int selector, u32int flags);
void remap_irq_table();
extern void idt_flush(u32int);
extern void assemble_idt();

// INTERRUPT.C
void handle_isr(isr_stack registers);
void clear_isr_handlers();
void add_isr_handler(int index, isr_handler handler);
void del_isr_handler(int index);
extern void start_interrupts();
extern void stop_interrupts();
extern void halt_cpu();

// IOWRAPPER.C
void put_char(char c);
void put_string(char* c);
void put_dec(u32int i);
void put_padded_dec(u32int d, int padding);
void put_hex(u32int i);
void put_padded_hex(u32int d, int padding);
void put_bool(bool b);
char get_char();
char* get_string();
int get_dec();
int get_hex();
void init_iowrapper();
void keyboard_iowrapper_handler(int type, u8int scancode, bool depressed);
void set_fgbg(u8int foreground, u8int background);
output_colors get_colors();
void set_colors(output_colors colors);
void set_cursor(int x, int y);
void get_cursor(int* x, int* y);
void clear();
void endl();
void dec_cursor();
void inc_cursor();
unsigned char resolve_character(u8int scancode);

// KEYBOARD.C
void init_keyboard();
void keyboard_callback(isr_stack stack);
bool shift_status();
bool alt_status();
bool control_status();
bool capslock_status();
bool numlock_status();
bool scrolllock_status();
void add_kb_handler(keyboard_handler callback);
void del_kb_handler(keyboard_handler callback);
void keyboard_mode_handler(int type, u8int scancode, bool depressed);
void notify(int type, u8int scancode, bool depressed);
int resolve_type(u8int scancode);
void keyboard_led();

// TIMER.C
void init_timer(u32int frequency);
void timer_callback(isr_stack stack);
void scheduler();

// VIDEO.C
void put_cursor_at(int x, int y);
void put_character_at(char c, int x, int y, u8int foreground, u8int background);
void scroll_buffer(char c, u8int foreground, u8int background);
void fill_buffer(char c, u8int foreground, u8int background);
u16int vidmem_char_for(char c, u8int foreground, u8int background);

// OCEANIA.C
extern int main();

// TASK.C
void init_task();
task create_blank_task();
gdt_entry create_tss_descriptor(tss_table* tss);
void set_tss_descriptor(gdt_entry tss_descriptor);
gdt_entry get_tss_descriptor();
gdt_entry create_ldt_descriptor(unsigned long long* ldt);
void set_ldt_descriptor(gdt_entry ldt_descriptor);
gdt_entry get_ldt_descriptor();
void new_task(task* desc, void* eip, u32int* stack);
void exit(int error_code);
void end_task();
void scheduling_callback();
extern void set_task_registers();
extern void task_switch();

// DEBUG.C
void debug_isr_stack(isr_stack stack);
void debug_cr0(u32int cr0);
void debug_cr4(u32int cr4);
void debug_gdt_entry(gdt_entry entry);
void debug_eflags(u32int eflags);
int force_exception();

// PRINTF.C
void printf(char* control_string, ...);
void* argumentLocation(int i);
char* stringArgumentNumber(int i);
int intArgumentNumber(int i);
char charArgumentNumber(int i);
